package it.agm.fanta;


import it.agm.fanta.activity.fragment.CalendarioFragment;
import it.agm.fanta.activity.fragment.ClassificaFragment;
import it.agm.fanta.activity.fragment.ClassificaMarcatoriFragment;
import it.agm.fanta.activity.fragment.FormazioneReadFragment;
import it.agm.fanta.activity.fragment.FormazioneWriteFragment;
import it.agm.fanta.activity.fragment.PartitaLegaFragment;
import it.agm.fanta.activity.fragment.RosaFragment;
import it.agm.fanta.adapter.IndicePosizione;
import it.agm.fanta.model.DettaglioFormazioneLega;
import it.agm.fanta.model.Giocatore;
import it.agm.fanta.model.GiocatorePartitaLega;
import it.agm.fanta.model.LegaSquadra;
import it.agm.fanta.model.Marcatore;
import it.agm.fanta.model.Partita;
import it.agm.fanta.model.Partite;
import it.agm.fanta.model.Request;
import it.agm.fanta.model.RequestSetFormazione;
import it.agm.fanta.model.Squadra;
import it.agm.fanta.model.Utente;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Logger;
import com.google.android.gms.analytics.Tracker;

import android.app.Activity;
import android.app.Application;
import android.content.Context;

/**
 * <b>Description:</b>Classe contenente i dati da mantenere in sessione
 * 
 * @author AGM
 */
public class FantaserviceApp extends Application {
	
	
	private static Context context;
	private static Activity activity;
	public static Utente utente;
	public static Request request;
	public static RequestSetFormazione requestSetFormazione;
	public static Squadra[] squadre ;
	public static Partite partite ;
	public static Partita partitaLive;
	public static boolean partitaGiocata = false;
	
	public static ArrayList<Giocatore> rosa ;
	public static ArrayList<Giocatore> formazioneReaded = new ArrayList<Giocatore>();
	public static List<Giocatore> formazioneWritten = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> portieriDaSchierare = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> attaccantiDaSchierare = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> difensoriDaSchierare = new  ArrayList<Giocatore>();
	public static ArrayList<Giocatore> centrocampistiDaSchierare = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> portieriRiserva = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> attaccantiRiserva = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> difensoriRiserva = new ArrayList<Giocatore>();
	public static ArrayList<Giocatore> centrocampistiRiserva = new ArrayList<Giocatore>();
	public static List<IndicePosizione> indiciTitolari = new  ArrayList<IndicePosizione>();
	public static List<IndicePosizione> indiciRiserve = new  ArrayList<IndicePosizione>();
	public static HashMap<Integer, Character> sostituzioni = new HashMap<Integer, Character>();
	public static int nRiserve = 0;
	public static int nSostituzioni = 0;
	public static DettaglioFormazioneLega dettaglio;
	public static LegaSquadra lega;
	public static ArrayList<LegaSquadra> leghe;
	public static ArrayList<GiocatorePartitaLega> giocatorePartitaLega;
	public static ArrayList<Marcatore> marcatori;
	
	public static ClassificaFragment classificaFragment;
	public static CalendarioFragment calendarioFragment;
	public static ClassificaMarcatoriFragment classificaMarcatoriFragment;
	public static RosaFragment rosaFragment;
	public static FormazioneReadFragment formazioneReadFragment;
	public static PartitaLegaFragment partitaLegaFragment;
	public static FormazioneWriteFragment formazioneWriteFragment;
	public static int difesa;
	public static int centrocampo;
	public static int attacco;
	private static final int INDEX_SIZE_RISERVE = 14;
	private static final int INDEX_SIZE_TITOLARI = 12;
	
	private static final String PROPERTY_ID = "UA-54529042-2";
	
	public enum TrackerName {
		APP_TRACKER, // Tracker used only in this app.
		GLOBAL_TRACKER, // Tracker used by all the apps from a company. eg:
						// roll-up tracking.
		ECOMMERCE_TRACKER, // Tracker used by all ecommerce transactions from a
							// company.
	}

	HashMap<TrackerName, Tracker> mTrackers = new HashMap<TrackerName, Tracker>();
	    
	public synchronized Tracker getTracker(TrackerName trackerId) {
        if (!mTrackers.containsKey(trackerId)) {

            GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
            analytics.getLogger().setLogLevel(Logger.LogLevel.VERBOSE);
            Tracker t = (trackerId == TrackerName.APP_TRACKER) ? analytics.newTracker(PROPERTY_ID)
                    : (trackerId == TrackerName.GLOBAL_TRACKER) ? analytics.newTracker(R.xml.global_tracker)
                            : null;
            t.enableAdvertisingIdCollection(true);
            mTrackers.put(trackerId, t);
        }
        return mTrackers.get(trackerId);
    }

	
	@Override
	public void onCreate() {
		super.onCreate();
		leghe = new ArrayList<LegaSquadra>();
		utente = new Utente();
		FantaserviceApp.context = getApplicationContext();
	}

	public synchronized static Context getAppContext() {
	    return FantaserviceApp.context;
	}
	public static void setCurrentActivity(Activity currentActivity) {
	    activity = currentActivity;
	}

	public static Activity currentActivity() {
	    return activity;
	}

	
	
	/**
	 * @param moduloArray
	 */
	public static void setSessionModule() {
		String[] moduloArray = FantaserviceApp.dettaglio.getModulo().split("-");
		FantaserviceApp.difesa = new Integer(moduloArray[0]).intValue();
		FantaserviceApp.centrocampo =  new Integer(moduloArray[1]).intValue();
		FantaserviceApp.attacco =  new Integer(moduloArray[2]).intValue();
	}
	
	
	/**
	 * @param giocatore
	 */
	public static void addCalciatoreToListeFormazione(Giocatore giocatore) {
		switch (giocatore.getRuolo()) {
		case Giocatore.PORTIERE:
			if(Giocatore.TITOLARE == giocatore.getLineup()){
				FantaserviceApp.portieriDaSchierare.add(giocatore);
			}else if(Giocatore.RISERVA == giocatore.getLineup()){
				FantaserviceApp.portieriRiserva.add(giocatore);
			}
			break;
		case Giocatore.DIFENSORE:
			if(Giocatore.TITOLARE == giocatore.getLineup()){
				FantaserviceApp.difensoriDaSchierare.add(giocatore);
			}else if(Giocatore.RISERVA == giocatore.getLineup()){
				FantaserviceApp.difensoriRiserva.add(giocatore);
			}
			break;
		case Giocatore.CENTROCAMPISTA:
			if(Giocatore.TITOLARE == giocatore.getLineup()){
				FantaserviceApp.centrocampistiDaSchierare.add(giocatore);
			}else if(Giocatore.RISERVA == giocatore.getLineup()){
				FantaserviceApp.centrocampistiRiserva.add(giocatore);
			}
			break;
		case Giocatore.ATTACCANTE:
			if(Giocatore.TITOLARE == giocatore.getLineup()){
				FantaserviceApp.attaccantiDaSchierare.add(giocatore);
			}else if(Giocatore.RISERVA == giocatore.getLineup()){
				FantaserviceApp.attaccantiRiserva.add(giocatore);
			}
			break;

		default:
			break;
		}
	}
	

	/**
	 * 
	 */
	public static void ripopolaFormazine() {
		FantaserviceApp.formazioneWritten = new ArrayList<Giocatore>();
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.portieriDaSchierare);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.portieriRiserva);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.difensoriDaSchierare);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.difensoriRiserva);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.centrocampistiDaSchierare);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.centrocampistiRiserva);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.attaccantiDaSchierare);
		FantaserviceApp.formazioneWritten.addAll(FantaserviceApp.attaccantiRiserva);
	}
	
	/**
	 * 
	 */
	public static void generaIndici() {
		for(int i=1 ; i<=INDEX_SIZE_TITOLARI ; i++ ){
			IndicePosizione index = new IndicePosizione();
			index.setChecked(false);
			index.setIndex(i);
			FantaserviceApp.indiciTitolari.add(index);
		}
		for(int i=1 ; i<=INDEX_SIZE_RISERVE ; i++ ){
			IndicePosizione index = new IndicePosizione();
			index.setChecked(false);
			index.setIndex(i);
			FantaserviceApp.indiciRiserve.add(index);
		}
	}
	
	/**
	 * Metodo per resettare i dati in sessione
	 */
	public static void resetApplicationData(){
		rosa = new  ArrayList<Giocatore>();
		leghe = new ArrayList<LegaSquadra>();
		utente = new Utente();
		request = new Request();
		requestSetFormazione = new RequestSetFormazione();
		partitaGiocata = false;
		partite = new Partite();
		partitaLive = new Partita();
		resetListeFormazione();
	}
	
	/**
	 * Metodo per resettare le liste associate alle formazioni
	 */
	public static void resetListeFormazione() {
		
		formazioneReaded = new ArrayList<Giocatore>();
		formazioneWritten = new ArrayList<Giocatore>();
		portieriDaSchierare = new ArrayList<Giocatore>();
		attaccantiDaSchierare = new ArrayList<Giocatore>();
		difensoriDaSchierare = new  ArrayList<Giocatore>();
		centrocampistiDaSchierare = new ArrayList<Giocatore>();
		portieriRiserva = new ArrayList<Giocatore>();
		attaccantiRiserva = new ArrayList<Giocatore>();
		difensoriRiserva = new ArrayList<Giocatore>();
		centrocampistiRiserva = new ArrayList<Giocatore>();
		indiciRiserve = new ArrayList<IndicePosizione>();
		indiciTitolari = new ArrayList<IndicePosizione>();
	}
}
